﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using Entities;
using BLL.Validation;
using DAL;
using DAL.IRepository;

namespace BLL
{
   
    public class GiaoVienManager : IValidator<GiaoVien>
    {
       private readonly IGeneralRepository<GiaoVien> _repository;

        public GiaoVienManager(IGeneralRepository<GiaoVien> itr)
        {
            _repository = itr;
        }

        public ValidationResult Validate(GiaoVien giaovien)
        {
            var vResult = new ValidationResult();

            if (string.IsNullOrEmpty(giaovien.HoTen.Trim()))
                vResult.Messages.Add("Tên giáo viên phải khác chuỗi rỗng");
            if (string.IsNullOrEmpty(giaovien.DiaChi.Trim()))
                vResult.Messages.Add("Địa chỉ giáo viên phải khác chuỗi rỗng");
            if (string.IsNullOrEmpty(giaovien.ChucVu.Trim()))
                vResult.Messages.Add("Chức vụ giáo viên phải khác chuỗi rỗng");
            if (string.IsNullOrEmpty(giaovien.HocVi.Trim()))
                vResult.Messages.Add("Học Vị giáo viên phải khác chuỗi rỗng");
            if (string.IsNullOrEmpty(giaovien.Email.Trim()))
                vResult.Messages.Add("Email giáo viên không hợp lệ!");
            return vResult;
        }


        public ActionResult InsertOrUpdate(GiaoVien giaovien)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(giaovien))
                    aResult.Exceptions.Add(new Exception("Thêm mới giáo viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        public ActionResult Delete(GiaoVien giaovien)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(giaovien))
                    aResult.Exceptions.Add(new Exception("Xóa thông tin giáo viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        public ActionResult Delete(string giaovienId)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(t => t.MaGV == giaovienId))
                    aResult.Exceptions.Add(new Exception("Xóa thông tin giáo viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        public ActionResultAsList<GiaoVien> Find(Expression<Func<GiaoVien, bool>> predicate)
        {
            var aResult = new ActionResultAsList<GiaoVien>();
            try
            {
                aResult.Result = _repository.Find(predicate).ToList();
                if (aResult.Result.Count == 0)
                    aResult.Exceptions.Add(new Exception("Không tìm thấy giáo viên thỏa điều kiện"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }
    }
}
